package com.emn.fil.iapoker.dto;

import java.util.HashMap;
import java.util.List;

import com.emn.fil.iapoker.dto.carte.Carte;
import com.emn.fil.iapoker.dto.carte.Main;
import com.emn.fil.iapoker.dto.carte.Tapis;


public class Partie {
		
	private Poker poker;
	
	private StatusPartie statusPartie;
	
	private HashMap<Joueur, Main> listesMains;
	
	private Tapis tapis;
	
	private int idDonneur;
	
	private HashMap<StatusPartie, Mises> mises;
	
	private Joueur lastJoueur;
	
	private int joueurEnCours;
	
	private int pot;
	
	public Partie(Poker poker) {
		
		this.poker = poker;
		
		poker.getTable().setPartie(this);
		
		statusPartie = StatusPartie.PRE_FLOP;
		
		listesMains = new HashMap<Joueur, Main>();
		
		tapis = new Tapis();
		
		mises = new HashMap<StatusPartie, Mises>();
		
		StatusPartie[] statusParties = StatusPartie.values();
		
		for(StatusPartie statusPartie : statusParties) {
			Mises mise = new Mises(poker.getTable());
			mises.put(statusPartie, mise);
		}
		
		pot = 0;
		
	}

	public StatusPartie getStatusPartie() {
		return statusPartie;
	}

	public HashMap<Joueur, Main> getListesMains() {
		return listesMains;
	}
	
	public Main getMain(Joueur joueur) {
		return listesMains.get(joueur);
	}

	public Tapis getTapis() {
		return tapis;
	}
	
	public void addJoueur(Joueur joueur, Main main) {
		
		listesMains.put(joueur, main);
		
	}
	
	public void setDonneur(int donneur) {
		this.idDonneur = donneur;
	}
	
	public int getDonneur() {
		return idDonneur;
	}
	
	public Mises getMises() {
		
		return mises.get(statusPartie);
		
	}

	public int getJoueurEnCours() {
		return joueurEnCours;
	}

	public void setJoueurEnCours(int joueurEnCours) {
		this.joueurEnCours = joueurEnCours;
	}
	
	public void addPot(int amount) {
		pot += amount;
	}

	public int getPot() {
		return pot;
	}
	
	public void nextStatusPartie() {
		
		switch(statusPartie) {
		case PRE_FLOP:
			statusPartie = StatusPartie.FLOP;
			break;
		case FLOP:
			statusPartie = StatusPartie.TURN;
			break;
		case TURN:
			statusPartie = StatusPartie.RIVER;
			break;
		case RIVER:
			statusPartie = StatusPartie.FINIE;
			break;
		}
		
	}

	public int getTotaleMise(Joueur joueur) {
		int total = 0;
		
		StatusPartie[] statusParties = StatusPartie.values();
		
		for(StatusPartie statusPartie : statusParties) {
			total += mises.get(statusPartie).getMise(joueur);
		}
		
		return total;
	}

	public boolean hasFold(Joueur joueur) {
		
		

		StatusPartie[] statusParties = StatusPartie.values();
		
		for(StatusPartie statusPartie : statusParties) {
			Mises mise = mises.get(statusPartie);
			
			if(mise.getDecision(joueur) == Decision.FOLD)
				return true;
		}
		
		return false;
	}
}
